import 'dart:convert';
import 'package:http/http.dart' as http;

/// 函数
/// 声明函数， Dart声明函数，不需要function关键字，声明语法：
/// 返回类型  方法名称 （参数1, 参数2, ...） ｛
/// 方法体
/// return 返回值;
/// ｝
/// * 方法名称中不能出现特殊字符，建议使用小驼峰方式命名

// ******************************** 箭头函数 ********************************
// 普通函数
bool function1(s) {
  return s.isEmpty;
}

// 箭头函数
bool function2(s) => s.isEmpty;

// ******************************** 函数参数 ********************************
// 按照函数参数是否必须，函数参数分类两种： required和optional。
// required 类型参数在参数最前⾯， 随后是 optional 类型参数。

/// 位置参数
int sumUp(int a, int b, int c) {
  return a + b + c;
}

int sumUp2(int a, int b, [int c = 0]) {
  return a + b + c;
}
// 1. 可选参数放在中括号中
// 2. 可选参数必须放在必选参数后面
// 3. 可以给可以参数指定默认值

/// 命名参数
// 参数通过大括号指定
void operate(int a, int b, {String op = '+'}) {
  print("${a} ${op} ${b}");
}

// ******************************** 异步函数 ********************************
// Dart⽀持异步函数。
// JavaScript中的异步调⽤可以通过 Promise来实现。
// Dart中，通过 Future 来实现异步操作。Dart中的异步函数与JavaScript中类似。
Future<String> getIPAddress() {
  final url = 'www.baidu.com';
  return http.get(Uri.http(url, "")).then((response) {
    String ip = jsonDecode(response.body)['origin'];
    return ip;
  });
}

// ******************************** 同步函数 ********************************
// 在JavaScript中，async函数返回⼀个 Promise。await 操作符⽤于等待Promise
// 在 Dart中，async 函数返回⼀个Future ，⽽函数体会在未来执⾏。await 操作符⽤于等待 Future 。
Future<String> getIPAddress2() async {
  final url = 'www.baidu.com';
  final response = await http.get(Uri.http(url, ""));
  String ip = jsonDecode(response.body)['origin'];
  return ip;
}

void main(List<String> args) {
  // ******************************** 异步函数 ********************************
  getIPAddress()
      .then((value) => print(value))
      .catchError((error) => print(error));
  // ******************************** 同步函数 ????? **************************
  // try {
  //   final ip = await getIPAddress2();
  //   print(ip);
  // } catch (error) {
  //   print(error);
  // }
}
